
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package managedBean;

import entities.Administrateur;
import entities.Client;
import entities.Commentaire;
import entities.Commercant;
import entities.Enseigne;
import entities.Utilisateur;
import java.io.IOException;
import javax.ejb.EJB;
import javax.inject.Named;
import javax.enterprise.context.SessionScoped;
import java.io.Serializable;
import java.util.Collection;
import java.util.List;

import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import sessions.GestionnaireEnseigne;
import sessions.GestionnaireUtilisateur;

/**
 *
 * @author Sangre
 */
@Named(value = "utilisateurMBean")
@SessionScoped
public class UtilisateurMBean implements Serializable {

    @EJB
    private GestionnaireUtilisateur gestionnaireUtilisateur;
    @EJB
    private GestionnaireEnseigne gestionnaireEnseigne;
    private static String type;
    private static Utilisateur userconnecte;
    private boolean connecte = false;
    private Utilisateur utilModif;
    //private HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);

    
    

    /** Creates a new instance of UtilisateurMBean */
    public UtilisateurMBean() {
    }

    public List<Utilisateur> getUsers() {
        return gestionnaireUtilisateur.getUsers();
    }

    public String getType() {
        if(type == null)
            type = "Invite";
        return type;
    }
    
    public static String getTypeUserCo() {
        if(type == null)
            type = "Invite";
        return type;
    }
    
    public static Utilisateur userCo()
    {
        return userconnecte;
    }
    
    public static List<Enseigne> userCoFavoris()
    {
        Client cl = (Client) userconnecte;
        return (List<Enseigne>) cl.getFavoris();
    }

    public Utilisateur getUserconnecte() {
        return userconnecte;
    }
    
    public boolean estAdmin() {
        boolean bool = this.getType().equalsIgnoreCase("administrateur");
        System.out.println("BOOL "+bool);
        return bool;
    }
    
    public Boolean estClient() {
        boolean bool = this.getType().equalsIgnoreCase("client");
        return bool;
    }
    
    public Boolean estCommercant() {
        boolean bool = this.getType().equalsIgnoreCase("commercant");
        return bool;
    }

    public Utilisateur getUtilModif() {
        return utilModif;
    }

    public void setUtilModif(Utilisateur utilModif) {
        this.utilModif = utilModif;
    }
 
    public String getInfoSession(){
        /*if(userconnecte == null || session.getAttribute("user") == null){
            return getType();
        }
        else
            return getUserconnecte().getLogin()+", vous êtes un "+getType();*/
        return "Hello";
        
    }
    
    public boolean valideInfos(String login, String mdp, String nom, String prenom, String email, String telephone){
        boolean erreur = false;
        if (login.equals("")) {
            erreur = true;
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "", "Veuillez entrer un login"));
        }
        else if (login.length() < 5){
            erreur = true;
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "", "Login trop court, 5 caractères minimum"));
        }
        else if (!login.matches("[a-z0-9]*")){
            erreur = true;
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "", "Pas de caractère spéciaux pour le login"));
        }
        else if (gestionnaireUtilisateur.getUtilisateurByLogin(login)!= null){
            erreur = true;
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "", "Login déjà existant"));
        }
        if (mdp.equals("")) {
            erreur = true;
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "", "Veuillez entrer un mot de passe"));
        }
        else if (mdp.length() < 5){
            erreur = true;
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "", "Mot de passe trop court, 5 caractères minimum"));
        }
        else if (!mdp.matches("[a-z0-9]*")){
            erreur = true;
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "", "Pas de caractère spéciaux pour le mot de passe"));
        }
        if (nom.equals("")) {
            erreur = true;
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "", "Veuillez entrer un nom"));
        }
        else if (nom.length() < 5){
            erreur = true;
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "", "Nom trop court, 5 caractères minimum"));
        }
        else if (!nom.matches("[a-zA-Z]*")) {
            erreur = true;
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "", "Nom incorrect"));
        }
        if (prenom.equals("")) {
            erreur = true;
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "", "Veuillez entrer un prenom"));
        }
        else if (prenom.length() < 3){
            erreur = true;
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "", "Prénom trop court, 3 caractères minimum"));
        }
        else if (!prenom.matches("[a-zA-Z]*")) {
            erreur = true;
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "", "Prénom incorrect"));
        }
        if (email.equals("")) {
            erreur = true;
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "", "Veuillez entrer une adresse mail"));
        }
        else if (!email.matches("^[a-zA-Z0-9._-]+@[a-z0-9._-]{2,}\\.[a-z]{2,4}$")) {
            erreur = true;
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "", "Email incorrecte"));
        }
        else if (gestionnaireUtilisateur.getUtilisateurByEmail(email) != null && !erreur){
            erreur = true;
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "", "Email déjà utilisé"));
        }
        if (telephone.equals("")) {
            erreur = true;
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "", "Veuillez entrer un numéro de téléphone valide"));
        }
        else if (!telephone.matches("^[0-9]{10}$")) {
            erreur = true;
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "", "Veuillez entrer un numéro de téléphone valide"));
        }
        
        return erreur;
    }

    public void creerUtilisateur(String login, String mdp, String nom, String prenom, String email, String telephone, boolean typeUtilisateur) {
        
        if (!valideInfos(login, mdp, nom, prenom, email, telephone)) {
            connecte = true;
            if (typeUtilisateur) {
                Commercant comm = new Commercant(login, mdp, nom, prenom, email, telephone);
                type = "Commercant";
                userconnecte = comm;
                gestionnaireUtilisateur.creerUtilisateur(comm);
                
            } else {
                Client clt = new Client(login, mdp, nom, prenom, email, telephone);
                type = "Client";
                userconnecte = clt;
                gestionnaireUtilisateur.creerUtilisateur(clt);
            }
            try {
                FacesContext.getCurrentInstance().getExternalContext().redirect("index.xhtml");
            } catch (IOException ex) {
                Logger.getLogger(UtilisateurMBean.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

    public void creerUtilisateurTest() {
        Client c = new Client("vincent", "vincent", "vincent", "vincent", "vincent@vincent.com", "1111111111");
        

        gestionnaireUtilisateur.creerUtilisateur(new Administrateur("Michel", "Michel", "Michel", "Michel", "Michel@michel.com", "00000000000"));
        gestionnaireUtilisateur.creerUtilisateur(c);
        gestionnaireUtilisateur.creerUtilisateur(new Commercant("aymeric", "aymeric", "aymeric", "aymeric", "aymeric@aymeric.com", "2222222222"));

        gestionnaireUtilisateur.creerUtilisateur(new Administrateur("alexia", "alexia", "alexia", "alexia", "alexia@alexia.com", "33333333333"));
        gestionnaireUtilisateur.creerUtilisateur(new Client("pierre", "pierre", "pierre", "pierre", "pierre@pierre.com", "4444444444"));
        gestionnaireUtilisateur.creerUtilisateur(new Commercant("nico", "nico", "nico", "nico", "nico@nico.com", "5555555555"));

    }

    public void connecter(String login, String mdp) {

        try {
            if (login.equals("") || mdp.equals("")) {
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "", "Veuillez entrer un login/mot de passe"));
            } else {
                Utilisateur utilisateur = gestionnaireUtilisateur.getUtilisateur(login, mdp, null);
                if (utilisateur != null) {
                    FacesContext.getCurrentInstance().getExternalContext().redirect("index.xhtml");
                    userconnecte = utilisateur;
                    type = userconnecte.getClass().getSimpleName();
                    
                } else {
                    FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "", "Probleme avec login/mot de passe"));
                }
            }
        } catch (IOException ex) {
            Logger.getLogger(UtilisateurMBean.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    public void deconnexion() throws IOException{
        userconnecte = null;
        type = null;
        FacesContext.getCurrentInstance().getExternalContext().redirect("index.xhtml");
    }

    public void detailUser(Utilisateur user) throws IOException {
        FacesContext.getCurrentInstance().getExternalContext().redirect("./../index.xhtml");
    }
    
    public boolean getConnecte(){
        if(userconnecte != null) return true;
        else return false;
    }
    
    public void addFavoris(Enseigne e)
    {
        gestionnaireUtilisateur.addFavoris(e, (Client) userconnecte);
    }
    
    public void updateCurrentUser() {        
        if (valideInfos(userconnecte.getLogin(), userconnecte.getMotDePasse(), userconnecte.getNom(), userconnecte.getPrenom(), userconnecte.getEmail(), userconnecte.getTelephone())) {
            gestionnaireUtilisateur.modifierUser(userconnecte);
        }
    }
    public void updateUtilModif() {        
        if (valideInfos(utilModif.getLogin(), utilModif.getMotDePasse(), utilModif.getNom(), utilModif.getPrenom(), utilModif.getEmail(), utilModif.getTelephone())) {
            gestionnaireUtilisateur.modifierUser(utilModif);
        }
    }
    
    public void resetUtilisateur() {
        userconnecte = gestionnaireUtilisateur.getUtilisateurById(userconnecte.getId());
    }
    public void detailUtilisateur(Utilisateur util) {
        this.utilModif = util;
        try{ 
            FacesContext.getCurrentInstance().getExternalContext().redirect("edituser.xhtml");
        } catch (Exception ex) {
            Logger.getLogger(EnseigneMBean.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    public boolean userModifEstCommercant()
    {
        boolean result = false;
        if(!gestionnaireEnseigne.getEnseigneUser(utilModif.getId()).isEmpty())
        {
            result = true;
        }
        return result;
    }
    
    public Collection<Enseigne> enseignesByUserModif()
    {
        return gestionnaireEnseigne.getEnseigneUser(utilModif.getId());
    }
    
    public void administrateurDetails()
    {
        try {
            double nbCli  = gestionnaireUtilisateur.getClients().size();
            double nbCom = gestionnaireUtilisateur.getCommercants().size();
            ChartBean.setDataChart(nbCli,nbCom);
            FacesContext.getCurrentInstance().getExternalContext().redirect("administration.xhtml");
        } catch (IOException ex) {
            Logger.getLogger(UtilisateurMBean.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}